<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 第一题
    // var x = 10;
    // function fn() {
    //     console.log(x)
    // }
    // function show(f) {
    //     var x = 20
    //     f();
    // }
    // show(fn);
    // 结果为10，
    // 步骤一先走到show（fn）
    // 步骤二跳到函数show（）执行
    // 步骤三因为参数是函数fn（）所以 跳到函数fn（）执行
    // 步骤四打印x，函数体没有x这个变量，去外面找，找到外面的var x=10的变量，并打印出来

    // ------------------------------------------------------------------------------------
    // 第二题
    // var fn = function () {
    //     console.log(fn)
    // }
    // fn()
    // var obj = {
    //     fn2: function () {
    //         console.log(fn2)
    //     }
    // }
    // obj.fn2()
    // 结果为fn（）的函数结构
    // 步骤一执行fn（），执行函数表达式的函数体console.log(fn)，由于没有调用所以打印出来为函数表达式fn的函数结构
    //  步骤四obj.fn2()这里面,并没有fn2的声明，所以为undefined
    // ------------------------------------------------------------------------------------
    // 第三题
    // 形参和变量声明提升的优先级，形参>变量声明提升
    // function fun(num) {
    //     console.log(num);
    //     var num = 5;
    //     console.log(num);
    // }
    // fun(10)
    // 结果为第一个打印结果为10，第二个打印结果为5
    // 步骤一先执行fn（10）这一步
    // 步骤二跳到函数fn（）执行，num参数为10，第一个直接打印传进来的参数10
    // 步骤三声明一个变量num，并且赋值为5
    // 步骤四由于第二个打印在新定义的变量num下面，所以打印的是变量num
    // ------------------------------------------------------------------------------------
    // 第四题
    // 形参和函数声明提升的优先级，函数声明提升>形参
    // function fun(ger) {
    //     console.log(ger);
    //     function ger() {
    //         alert("hello world");
    //     }
    // }
    // fun(5)
    // 结果为ger()函数结构
    // 步骤一先执行fun（5）这一步
    // 步骤二跳到fun（）函数执行函数体，打印ger函数结构
    // ------------------------------------------------------------------------------------
    // 第五题
    // 形参和函数表达式声明提升的优先级，形参>函数表达式声明提升
    // function fun(ger) {
    //     console.log(ger);
    //     var ger = function () {//函数表达式
    //         alert("hello world");
    //     }
    // }
    // fun(5)
    // 结果为5
    // 步骤一先执行fun（5）这一步
    // 步骤二跳到fun（）函数执行函数体，此时fn（ger）的参数ger为5
    // 步骤三函数表达式被赋值给了局部变量 ger，由于console.log(ger)并没有调用这个函数表达式
    // 步骤四所以打印的为传进来的参数5
    // ------------------------------------------------------------------------------------
    // 第六题
    // function a(b) {
    //     console.log(b);
    //     function b() {
    //         console.log(b);
    //     }
    //     b();
    // }
    // a(1)
    // 结果为b的函数结构
    // 步骤一先执行a（1）这一步
    // 步骤二跳到a（）函数执行函数体,首先执行 console.log(b)打印了函数b的结构
    // 步骤三然后跳过函数b（），到调用b（）这一步
    // 步骤四执行函数b的函数体，打印b这个函数的结构
    // ------------------------------------------------------------------------------------
    // 第七题
    // function a(b) {
    //     console.log(b);
    //     var b = function () { //函数表达式
    //         console.log(b);
    //     }
    //     b();
    // }
    // a(1)

    // 结果为1，函数表达式b的函数结构
    // 步骤一先执行a（1）这一步
    // 步骤二跳到a（）函数执行函数体,首先执行 console.log(b),此时b为传进来的参数1
    // 步骤三函数表达式被赋值给了局部变量 b，由于console.log(b)并没有调用这个函数表达式所以打印的为传进来的参数1
    // 步骤四到调用b（）这一步，打印b这个函数的结构
    // ------------------------------------------------------------------------------------
    // 第八题
    // 形参和变量提升打的优先级（函数提升，变量提升），预解析
    // function test(a, b) {
    //     console.log(a);
    //     console.log(b);
    //     var b = 234;
    //     console.log(b);
    //     a = 123;
    //     console.log(a);
    //     function a() { };//同名的函数声明优先级最高
    //     var a;
    //     b = 234;
    //     var b = function () { };
    //     console.log(a);
    //     console.log(b);
    // }
    // test(1)
    // 结果为a的函数结构，undefined,234,123,123,函数表达式b的函数结构
    // 第一次打印先执行test（1），跳到函数test执行函数体，此时函数test（a，b）中，a的值为传进来的参数1，b没有值，第一个打印，因为没有调用函数a，所以打印出来的是函数a的结构
    // 第二次打印
    // 打印b，找到var b =234，变量提升为
    // var b；
    // console.log（b）；
    // b=234；
    // 因此b打印出来为undefined
    // 第三次打印打印b，此时找到上面有声明的一个b变量，值为234，所以打印出来是234
    // 第四次打印打印a，此时找到上面有声明的一个a变量，值为123，所以打印出来是123
    // 第五次打印打印a，此时找到上面有声明的一个a变量，值为123，所以打印出来是123
    // 第六次打印打印b，此时找到上面有声明的一个函数表达式b，因此打印出来的是函数表达式b的函数结构
    // ------------------------------------------------------------------------------------
    // 第九题
    // console.log(test);
    // function test(test) {
    //     console.log(test);
    //     var test = 234;
    //     console.log(test);
    //     function test() { }
    // }
    // test(1);
    // var test = 123;
    // 结果为test函数的结构，test函数体内的test函数的结构，234
    // 步骤一首先执行console.log(test)，由于没有调用所以打印出来是test（）的函数结构，
    // 步骤二走到test（1），跳到test函数执行函数体，执行console.log(test)，在test函数体内找到了test函数，由于没有调用，所以打印test函数体内的test函数的结构
    // 步骤三声明一个test变量值为234，打印test，找到声明的变量test所以打印出来是234
    // ------------------------------------------------------------------------------------
    // 第十题
    // function test() {
    //     console.log(b);
    //     if (a) {
    //         var b = 100;
    //     }
    //     c = 234;
    //     console.log(c);
    // }
    // var a;
    // test();
    // a = 10;
    // test();
    // console.log(c);

    // 结果为undefined，234，undefined，234,234
    // 步骤一首先执行 test()，跳转到test函数执行函数体，a 被声明为 undefined，if (a) 条件不满足，所以 b 不会被赋值。
    // 步骤二由于 b 在函数内部没有被赋值所以 console.log(b); 会输出 undefined
    // 步骤三然后，全局变量 c 被赋值为 234，并打印出来，第二个test（）也是如此
    // 步骤四最后，console.log(c)， 打印全局变量 c 的值，这个值是 234
    // ------------------------------------------------------------------------------------
    // 第十一题
    // function bar() {
    //     return foo;
    //     foo = 10;
    //     function foo() { };
    //     var foo = 11;
    // }
    // console.log(bar());

    // 结果为foo的函数结构
    // 步骤一先执行console.log(bar())跳转到bar函数执行函数体
    // 步骤二return foo，由于没有调用所以打印出来为foo的函数结构
    // ------------------------------------------------------------------------------------
    // 第十二题
    // console.log(bar());
    // function bar() {
    //     foo = 10;
    //     function foo() { }
    //     var foo = 11;
    //     return foo;
    // }

    // 结果为11
    // 步骤一打印bar函数，调用了bar函数，于是跳转到bar函数执行函数体
    // 步骤二声明一个全局变量 foo 并赋值为 10
    // 步骤三然后函数foo函数体内var foo = 11，声明了一个局部变量 foo 并赋值为 11
    // 步骤四return foo， 返回的是变量 foo 的值，也就是 11

</script>

</html>